﻿#pragma once

#include "Controller.h"

#include <boost/signal.hpp>
#include "AccusationController.h"
#include "BoardController.h"
#include "DeductionController.h"

#include "../domain/models/CardsCollection.h"
#include "../domain/models/Player.h"
#include "../views/abstract/IAccusationView.h"

namespace Controllers {

	/** Klasa zarzadzająca przebiegiem tury
	* W zależności od tego, czy gracz dokonał oskarżenia, wywołuje odpowiednie funkcje z kontrolerów 
	* oskarżenia, planszy i dedukcji
	*/

	class TurnController: public Controller
	{
		typedef boost::signal<void ()> OnPlayerLose;
		typedef boost::signal<void ()> OnPlayerWin;
		typedef boost::signal<void ()> OnEndEvent;

		AccusationController* accusation_controller;
		BoardController* board_controller;
		DeductionController* deduction_controller;

	public:
		OnEndEvent turnEndEvent; /**< Zdarzenie zakończenia tury */
		OnPlayerLose playerLoseEvent; /**< Zdarzenie porażki gracza */
		OnPlayerWin playerWinEvent; /**< Zdarzenie zwycięstwa gracza */

		TurnController(AccusationController*, BoardController*, DeductionController*);
		~TurnController();

		void begin(); /**< Rozpoczyna turę */
	protected:
		void performAccusation(); /**< Używa Controllers::AccusationController do wykonania ruchu */
		void onAccusationCorrect(); /**<  Wywoływane w przypadku prawidłowego podejrzenia */
		void performMove(); /**< Używa Controllers::BoardController do wykonania ruchu */
		void performDeduction(); /**< Używa Controllers::DeductionController do przeprowadzenia dedukcji */
		void end(); /**< Wywołuje turnEndEvent */
	};
}

